﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using Entidades;

namespace AccesoBD
{
    public class HorariosAtencion
    {
        //obtiene los horarios de atencion VIGENTES para ese medico en esa especialidad
        public static List<HorarioAtencion> obtenerHorariosMedicoEnEspecialidad(int codEsp, long legajo)
        {
            List<HorarioAtencion> listHorarios = null;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "SELECT HorarioAtencionXMedicoXEspecialidad.codHorarioAtencionXMedicoXEspecialidad, HorarioAtencionXMedicoXEspecialidad.legajo, "
                      + "HorarioAtencionXMedicoXEspecialidad.codEspecialidad, HorarioAtencionXMedicoXEspecialidad.horaDesde, "
                      + "HorarioAtencionXMedicoXEspecialidad.horaHasta, HorarioAtencionXMedicoXEspecialidad.fechaVigenciaDesde, "
                      + "HorarioAtencionXMedicoXEspecialidad.fechaVigenciaHasta, HorarioAtencionXMedicoXEspecialidad.permiteSobreturno, "
                      + "HorarioAtencionXMedicoXEspecialidad.cantidadSobreturnos, Dia_Semana.nombre AS nombreDiaSemana, "
                      + "Consultorio.nombre AS nombreConsultorio, Frecuencia_HorarioAtencion.periodo, "
                      + "HorarioAtencionXMedicoXEspecialidad.diaSemana, HorarioAtencionXMedicoXEspecialidad.idConsultorio, HorarioAtencionXMedicoXEspecialidad.idFrecuenciaHorario "
                      + "FROM HorarioAtencionXMedicoXEspecialidad INNER JOIN Dia_Semana ON "
                      + "HorarioAtencionXMedicoXEspecialidad.diaSemana = Dia_Semana.codDiaSemana INNER JOIN "
                      + "Consultorio ON HorarioAtencionXMedicoXEspecialidad.idConsultorio = Consultorio.idConsultorio INNER JOIN "
                      + "Frecuencia_HorarioAtencion ON HorarioAtencionXMedicoXEspecialidad.idFrecuenciaHorario = Frecuencia_HorarioAtencion.idFrecuencia "
                      + "WHERE (HorarioAtencionXMedicoXEspecialidad.fechaVigenciaHasta IS NULL OR "
                      + "HorarioAtencionXMedicoXEspecialidad.fechaVigenciaHasta > GETDATE()) AND (HorarioAtencionXMedicoXEspecialidad.legajo = @legajo) "
                      + "AND (HorarioAtencionXMedicoXEspecialidad.codEspecialidad = @codEsp)";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@legajo", legajo));
                sqlcmd.Parameters.Add(new SqlParameter("@codEsp", codEsp));
                SqlDataReader dr = sqlcmd.ExecuteReader();

                listHorarios = new List<HorarioAtencion>();
                HorarioAtencion objHorario = null;
                while (dr.Read())
                {
                    objHorario = new HorarioAtencion();
                    objHorario.CodHorarioAtencion = int.Parse(dr["codHorarioAtencionXMedicoXEspecialidad"].ToString());
                    objHorario.CodEspecialidad = int.Parse(dr["codEspecialidad"].ToString());
                    objHorario.Legajo = int.Parse(dr["legajo"].ToString());
                    objHorario.HoraDesde = TimeSpan.Parse(dr["horaDesde"].ToString());
                    objHorario.HoraHasta = TimeSpan.Parse(dr["horaHasta"].ToString());
                    objHorario.FechaVigenciaDesde = DateTime.Parse(dr["fechaVigenciaDesde"].ToString());
                    if (dr["fechaVigenciaHasta"] == DBNull.Value)
                        objHorario.FechaVigenciaHasta = null;
                    else
                        objHorario.FechaVigenciaHasta = DateTime.Parse(dr["fechaVigenciaHasta"].ToString());
                    objHorario.PermiteSobreturno = bool.Parse(dr["permiteSobreturno"].ToString());
                    if (dr["cantidadSobreturnos"] == DBNull.Value)
                        objHorario.CantidadSobreturnos = null;
                    else
                        objHorario.CantidadSobreturnos = int.Parse(dr["cantidadSobreturnos"].ToString());
                    objHorario.IdDiaSemana = int.Parse(dr["diaSemana"].ToString());
                    objHorario.Dia = new DiaSemana();
                    objHorario.Dia.Nombre = dr["nombreDiaSemana"].ToString();
                    objHorario.IdConsultorio = int.Parse(dr["idConsultorio"].ToString());
                    objHorario.Consultorio = new Consultorio();
                    objHorario.Consultorio.Nombre = dr["nombreConsultorio"].ToString();
                    objHorario.IdFrecuenciaHorario = int.Parse(dr["idfrecuenciaHorario"].ToString());
                    objHorario.FrecuenciaHorario = new FrecuenciaHorarioAtencion();
                    objHorario.FrecuenciaHorario.Periodo = dr["periodo"].ToString();

                    listHorarios.Add(objHorario);
                    objHorario = null;
                }
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                conexion.Close();
            }
            return listHorarios;
        }

        //valida si un horario nuevo puede ser insertado, teniendo en cuenta su dia, su consultorio y el periodo de
        //horas en que va a estar ocupado. 
        //True = si si puede insertar
        //False = no se puede insertar, out el medico que ocupa ese horario.
        public static bool validarHorarioNuevo(HorarioAtencion horarioNuevo, out string medQueOcupaHorario)
        {
            bool res = true;
            medQueOcupaHorario = null; //partimos de que nadie ocupa ese horario

            List<HorarioAtencion> listHorariosFiltrados = null;

            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "SELECT codHorarioAtencionXMedicoXEspecialidad, legajo, codEspecialidad, horaDesde, horaHasta, "
                            + "diaSemana, fechaVigenciaDesde, fechaVigenciaHasta, idConsultorio "
                            + "FROM HorarioAtencionXMedicoXEspecialidad WHERE (fechaVigenciaHasta IS NULL OR "
                            + "fechaVigenciaHasta > GETDATE()) AND (idConsultorio = @idCons) AND (diaSemana = @dia)";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@idCons", horarioNuevo.IdConsultorio));
                sqlcmd.Parameters.Add(new SqlParameter("@dia", horarioNuevo.IdDiaSemana));
                SqlDataReader dr = sqlcmd.ExecuteReader();

                //si la consulta encontro algo, entonces lo guardamos en la lista para poder
                //comparar despues el periodo, que es lo que no se filtro antes.
                if (dr.HasRows)
                {
                    listHorariosFiltrados = new List<HorarioAtencion>();
                    HorarioAtencion objHorario = null;
                    while (dr.Read())
                    {
                        objHorario = new HorarioAtencion();
                        objHorario.CodHorarioAtencion = int.Parse(dr["codHorarioAtencionXMedicoXEspecialidad"].ToString());
                        objHorario.Legajo = long.Parse(dr["legajo"].ToString());
                        objHorario.CodEspecialidad = int.Parse(dr["codEspecialidad"].ToString());
                        objHorario.HoraDesde = TimeSpan.Parse(dr["horaDesde"].ToString());
                        objHorario.HoraHasta = TimeSpan.Parse(dr["horaHasta"].ToString());
                        objHorario.IdDiaSemana = int.Parse(dr["diaSemana"].ToString());
                        objHorario.FechaVigenciaDesde = DateTime.Parse(dr["fechaVigenciaDesde"].ToString());
                        if (dr["fechaVigenciaHasta"] == DBNull.Value)
                            objHorario.FechaVigenciaHasta = null;
                        else
                            objHorario.FechaVigenciaHasta = DateTime.Parse(dr["fechaVigenciaHasta"].ToString());
                        objHorario.IdConsultorio = int.Parse(dr["idConsultorio"].ToString());

                        listHorariosFiltrados.Add(objHorario);
                        objHorario = null;
                    }

                    //comenzamos a comparar a ver si se pisa o no con otro horario
                    foreach (HorarioAtencion item in listHorariosFiltrados)
                    {
                        if (horarioNuevo.HoraDesde <= item.HoraDesde && horarioNuevo.HoraHasta >= item.HoraHasta)
                        {
                            medQueOcupaHorario = "Legajo: " + item.Legajo + " - Hora Desde: " + item.HoraDesde + " - Hora Hasta: " + item.HoraHasta;
                            res = false;
                            break;
                        }
                        else if (horarioNuevo.HoraDesde >= item.HoraDesde && horarioNuevo.HoraDesde <= item.HoraHasta)
                        {
                            medQueOcupaHorario = "Legajo: " + item.Legajo + " - Hora Desde: " + item.HoraDesde + " - Hora Hasta: " + item.HoraHasta;
                            res = false;
                            break;
                        }
                        else if (horarioNuevo.HoraDesde >= item.HoraDesde && horarioNuevo.HoraHasta < item.HoraDesde)
                        {
                            medQueOcupaHorario = "Legajo: " + item.Legajo + " - Hora Desde: " + item.HoraDesde + " - Hora Hasta: " + item.HoraHasta;
                            res = false;
                            break;
                        }
                        else if(horarioNuevo.HoraDesde >= item.HoraDesde &&horarioNuevo.HoraDesde < item.HoraHasta)
                        {
                            medQueOcupaHorario = "Legajo: " + item.Legajo + " - Hora Desde: " + item.HoraDesde + " - Hora Hasta: " + item.HoraHasta;
                            res = false;
                            break;
                        }
                        else if (horarioNuevo.HoraHasta >= item.HoraDesde && horarioNuevo.HoraHasta < item.HoraHasta)
                        {
                            medQueOcupaHorario = "Legajo: " + item.Legajo + " - Hora Desde: " + item.HoraDesde + " - Hora Hasta: " + item.HoraHasta;
                            res = false;
                            break;

                        }
                        else if (horarioNuevo.HoraDesde >= item.HoraDesde && horarioNuevo.HoraDesde < item.HoraHasta)
                        {
                            medQueOcupaHorario = "Legajo: " + item.Legajo + " - Hora Desde: " + item.HoraDesde + " - Hora Hasta: " + item.HoraHasta;
                            res = false;
                            break;
                        }
                    }
                }

            }
            catch (Exception)
            {

                throw;
            }
            finally {
                conexion.Close();
            }
            return res;
        }

        public static bool insertarHorarioNuevo(HorarioAtencion nuevoHorario)
        {
            bool res = false;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "INSERT INTO HorarioAtencionXMedicoXEspecialidad (legajo, codEspecialidad, horaDesde, horaHasta, diaSemana, "
                            + "fechaVigenciaDesde, fechaVigenciaHasta, idConsultorio, permiteSobreturno, cantidadSobreturnos, idFrecuenciaHorario) "
                            + "VALUES (@legajo,@codEsp,@horaDesde,@horaHasta,@idDia,@fechaDesde,@fechaHasta,@idCons,@permST,@cantST,@idFrecuencia)";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@legajo", nuevoHorario.Legajo));
                sqlcmd.Parameters.Add(new SqlParameter("@codEsp", nuevoHorario.CodEspecialidad));
                sqlcmd.Parameters.Add(new SqlParameter("@horaDesde", nuevoHorario.HoraDesde));
                sqlcmd.Parameters.Add(new SqlParameter("@horaHasta", nuevoHorario.HoraHasta));
                sqlcmd.Parameters.Add(new SqlParameter("@idDia", nuevoHorario.IdDiaSemana));
                sqlcmd.Parameters.Add(new SqlParameter("@fechaDesde", nuevoHorario.FechaVigenciaDesde));
                if (nuevoHorario.FechaVigenciaHasta == null)
                    sqlcmd.Parameters.Add(new SqlParameter("@fechaHasta", DBNull.Value));
                else
                    sqlcmd.Parameters.Add(new SqlParameter("@fechaHasta", nuevoHorario.FechaVigenciaHasta));
                sqlcmd.Parameters.Add(new SqlParameter("@idCons", nuevoHorario.IdConsultorio));
                sqlcmd.Parameters.Add(new SqlParameter("@permST", nuevoHorario.PermiteSobreturno));
                if(nuevoHorario.CantidadSobreturnos == null)
                    sqlcmd.Parameters.Add(new SqlParameter("@cantST", DBNull.Value));
                else
                    sqlcmd.Parameters.Add(new SqlParameter("@cantST", nuevoHorario.CantidadSobreturnos));
                sqlcmd.Parameters.Add(new SqlParameter("@idFrecuencia", nuevoHorario.IdFrecuenciaHorario));
                int filas = sqlcmd.ExecuteNonQuery();

                if (filas > 0)
                    res = true;
            }
            catch (Exception)
            {
                
                throw;
            }
            finally
            {
                conexion.Close();
            }
            return res;
        }

        //se da de baja a un horario existente, el cual va a tener fechaVigenciaHasta la 
        //que se reciba por parametro, siempre y cuando no se hayan generado Turnos para
        //el horario ese, el cual es una validacion que la hare a posteriori (comment in 24/08)
        public static bool registrarBajaHorarioExistente(int codHorario, DateTime fechaHasta)
        {
            bool res = false;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "UPDATE HorarioAtencionXMedicoXEspecialidad SET fechaVigenciaHasta = @fechaHasta "
                                + "WHERE (codHorarioAtencionXMedicoXEspecialidad = @codHorario)";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@codHorario", codHorario));
                sqlcmd.Parameters.Add(new SqlParameter("@fechaHasta", fechaHasta));
                int filas = sqlcmd.ExecuteNonQuery();

                if (filas > 0)
                    res = true;
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                conexion.Close();
            }
            return res;
        }
    }
}
